ייעול שאילתא SQL
אני מנסה לייעל שאיתה שמופעלת עשרות פעמים פרטנית באיחוד תנאים כמו בדוגמא הנ"ל.
במקום שתפעל עשרות פעמים יצרתי שורת where ארוכה מאוד עם איחוד תנאים שונים.
אני מחפש נתון מסויים שיופיע רק עם אחד מזוג התנאים יתאים וגם יהיה שווה לאחד הערכים בתנאי השלישי.
העיניין שאני מגלה שכל OR כזה ממש מוריד את ביצועי החיפוש ועדיף כבר לחפש פרטנית..
יש למישהו הצעות לייעול?
תודה שבת שלום.
6 תשובות
להוסיף אינדקסים על השדות שלפיהם יש שליפות (וחיפושים).
במקרה הזה אפשר אינדקס אחד משותף על כל שלושת השדות, אבל בסדר c,b,a שמתחיל מ C
אהלן אלכס ..
יש אינדקסים פרטניים על כל אחד מהשדות שעליהן מבוצעות החיפוש..
עדיין מדובר בשרשור של 15/20 זוגות של תנאים עם OR ..ומשום מה OR מאט את החיפושים בDB קריטית..
השאלה אם ניתן לבצע פה משהו מסוג אחר בכדי לייעל את הפעולות
תודה רבה על התשובה
תוסיף explain לפני השאילת ותראה מה המסד מנסה לעשות כשהוא מפעיל את השאילתה.
אולי אפשר לשלוף שני סאב-סטים שונים של נתונים ואחרי זה לחבר (או לחסר) אותםי. זה מאוד תלוי בשאילת ובלי לראות אותה אין לי הרבה מה להגיד.
ככה בידיוק נראת השאילתא רק עם שמות שונים פישטתי את זה לצורה הפשוטה ביותר שאוכל להסביר..
צמד שדות בתוך תנאי אחד ועוד השוואה לקבוצת מספרים אחרת כמו בדוגמא
אקספליין לא מוציא משהו חריג..
מבחינת יעילות אין מה לעשות סאב-סלקט אולי להכניס קייס ?
אני לא חושב שפיצול איכשהו ישנה משהו, אבל אפשר אולי לנסות ככה:
test.c in( 1,2,3) AND
a in(12, 14) AND /* aint sure whether this will help or not. need a check */
b > 3 AND /* min(b) */
(
( test.a=12 and test.b>12) or
( test.a=14 and test.b>3)
)
ובמקום ליצור אינדקסים נפרדים על a ועל b
אולי יש טעם ליצור אינדקס משותף.
תודה רבה אני אבדוק